In processor-based systems that execute program instructions that process data, where either or both of instructions and data are stored in memory, it can be advantageous to control memory access. Controlling memory access may prevent data or instructions from being corrupted or inadvertently overwritten by poorly written or malicious program code. For example, a portion of memory may be dedicated to an operating system, and that portion of memory may only be accessible to a processor when the processor is operating in a supervisor mode to prevent malicious code from corrupting the operating system. As another example, some portions of memory may be designated as either cacheable or not cacheable, and other portions of memory may be designated as bufferable or not bufferable. Access to these designated portions of memory may also be controlled to prevent unexpected results.